package com.example.easyexcel.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.easyexcel.dao.DataIndexMapper;
import com.example.easyexcel.dto.DataIndex;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class DataIndexListener extends AnalysisEventListener<DataIndex> {

    private final DataIndexMapper mapper;
    private static final int BATCH_SIZE = 100; // 每100条批量插入一次
    private List<DataIndex> batchList = new ArrayList<>();

    public DataIndexListener(DataIndexMapper mapper) {
        this.mapper = mapper;
    }

    @Override
    public void invoke(DataIndex dto, AnalysisContext context) {
        DataIndex entity = convertToEntity(dto);
        batchList.add(entity);
        // 达到批量阈值时执行插入
        if (batchList.size() >= BATCH_SIZE) {
            saveBatch();
            batchList.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 处理最后一批剩余数据
        if (!batchList.isEmpty()) {
            saveBatch();
        }
        log.info("t_data_index Excel 导入完成");
    }

    private void saveBatch() {
        if (!batchList.isEmpty()) {
            mapper.insertBatch(batchList);
            log.info("批量插入 {} 条数据", batchList.size());
        }
    }

    /**
     * Excel数据转换为数据库实体（包含字符串转int的状态/类型转换）
     */
    private DataIndex convertToEntity(DataIndex dto) {
        DataIndex entity = new DataIndex();
        // 映射Excel基础字段（删除modelId相关代码，已移除该列）
        entity.setDataIndexCnName(dto.getDataIndexCnName());
        entity.setDataIndexAlias(dto.getDataIndexAlias());
        entity.setDataIndexEnName(dto.getDataIndexEnName());
        entity.setCoverageDescr(dto.getCoverageDescr());
        entity.setDataIndexCalcExpression(dto.getDataIndexCalcExpression());
        entity.setDataType(dto.getDataType());
        entity.setFormatRule(dto.getFormatRule());
        entity.setDataIndexUnits(dto.getDataIndexUnits());
        entity.setDataIndexMinGranularity(dto.getDataIndexMinGranularity());

        // 指标状态字符串转int（严格校验，避免无效值）
        if (dto.getDataIndexSc() == null || dto.getDataIndexSc().trim().isEmpty()) {
            throw new RuntimeException("Excel中指标状态不能为空（行数据：" + dto + "）");
        }
        entity.setDataIndexScCode(convertStatus(dto.getDataIndexSc().trim()));

        // 指标类型字符串转int（严格校验，避免无效值）
        if (dto.getDataIndexTc() == null || dto.getDataIndexTc().trim().isEmpty()) {
            throw new RuntimeException("Excel中指标类型不能为空（行数据：" + dto + "）");
        }
        entity.setDataIndexTcCode(convertType(dto.getDataIndexTc().trim()));

        // 数据库专用字段赋值
        entity.setCreatorName(getCurrentUserName()); // 从上下文获取当前登录用户
        entity.setModifierName(getCurrentUserName());
        LocalDateTime now = LocalDateTime.now();
        entity.setCreateTime(now);
        entity.setUpdateTime(now);

        return entity;
    }

    /**
     * 指标状态字符串转int（业务规则：发布→1，未发布→0，其他值抛异常）
     */
    private int convertStatus(String status) {
        switch (status) {
            case "发布":
                return 1;
            case "未发布":
                return 0;
            default:
                throw new RuntimeException("无效的指标状态：" + status + "，允许值：发布/未发布");
        }
    }

    /**
     * 指标类型字符串转int（业务规则：基础指标→1，组合指标→2，其他值抛异常）
     */
    private int convertType(String type) {
        switch (type) {
            case "基础指标":
                return 1;
            case "组合指标":
                return 2;
            default:
                throw new RuntimeException("无效的指标类型：" + type + "，允许值：基础指标/组合指标");
        }
    }

    /**
     * 从系统上下文获取当前登录用户（示例方法，需根据实际框架实现）
     */
    private String getCurrentUserName() {
        // 实际项目中需从SecurityContext或Session中获取
        return "admin"; // 临时占位，需替换为真实逻辑
    }
}